<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta http-equiv="X-UA-Compatible" content="IE=edge" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Document</title>
  </head>
  <body>
    <script>
      //         说明 a = b = c = d = 1;的执行过程
      // 查阅MDN的运算符优先级文档，找到赋值(=)运算符，发现多个=在一个表达式中是从右向左执行的
      // c=d=1是先执行d=1,然后把d=1的返回值赋值给c
      // 赋值(=)操作符的返回值:返回=右侧的值,所以d=1返回1,然后把1再赋值给c
      // 后边依次类推
      // for(var i = 0,j = 0; i < 5, j < 10; i++,j++){语句} 请问当前for循环的循环次数??为什么
      // 首先直到for循环是否能够向下继续循环,只要看for中的判断式
      // 判断式是多个,由逗号运算符间隔开,我们就要考虑逗号运算符的返回值
      // 逗号运算符如果出现多个,则从左向右执行,并返回逗号右侧的值
      // 所以当前的循环主要看j的次数来决定整个循环的次数

      // 代码题:请得到7天以后的现在的时间
      方式1;
      //1. 获取当前的时间
      new Date();
      //2. 获取当前时间的日期
      new Date().getDate();
      //3. 获取目标时间的日期
      new Date().getDate() + 7;
      //4. 获取当前的时间,把日期修改为目标日期
      new Date().setDate(new Date().getDate() + 7);
      方式2;
      //1. 得到7天以后的时间戳
      Date.now() + 1000 * 60 * 60 * 24 * 7;
      //2.创建一个时间,把7天以后的时间戳交给参数
      new Date(Date.now() + 1000 * 60 * 60 * 24 * 7);
      // 代码题:'abaabgfdebbafefgefsrsbabesseeeeaa' 请计算每一个字母出现的次数,及出现最多次数的字母
      const str = "abaabgfdebbaefefgfsrsbabesseeeeaa";

      //1.创建一个对象,用来保存每一个字符出现的次数
      const obj = {};

      //2. 遍历字符串的每一个字符,然后去对象中判断,如果对象中不存在,则给对象新增一个属性默认值为1,如果对象存在,则把对象的值+1
      for (let key of str) {
        obj[key] ? obj[key]++ : (obj[key] = 1);
      }
      console.log(obj);

      //3. 先初始化一个值用来保存出现最多的key,再初始化一个值用来保存出现最多key的次数
      let bigStr = "";
      let bigStrNum = 0;

      //4. 遍历对象,一个的判断
      for (let key in obj) {
        //如果当前遍历出的新值的次数 大于目前保存的次数,那你牛逼,我们跟你
        if (obj[key] > bigStrNum) {
          bigStr = key;
          bigStrNum = obj[key];
        }
      }

      console.log(bigStr, bigStrNum);
      // 让一个字符串的首字母大写,比如 "hello every one"--->"Hello every one"
      // 让一个字符串所有单词的首字母大写,比如"hello every one"--->"Hello Every One"
      // 数组去重的方法(3种)
      // 封装一个myNew函数实现new操作符,如下,让p1和p2有一样的效果
      function Person(name, age) {
        this.name = name;
        this.age = age;
      }
      Person.prototype.do = function () {};

      //原始new
      const p1 = new Person("xiaowang", 18);
      //手动封装new
      const p2 = myNew(Person, "xiaowang", 18);
      //   让一个不定宽高的元素在容器中水平垂直居中的方式(3种方式)
      //   给按钮绑定点击事件,频繁点击按钮时让事件最少间隔1s才能触发一次(节流),并且封装通用函数
      //   什么是事件流(事件机制)
      //   事件冒泡:事件从最精确的元素(target)开始向最不精确的元素(document)依次传播
      //   事件捕获:事件从最不精确的元素(document)开始向最精确的元素(target)依次传播
      //   W3C事件流: 当事件触发,先执行捕获过程 再执行目标元素的事件(target) 在执行冒泡过程

      // 整理HTML5新特性有哪些
      //       一、语义标签

      // 二、增强型表单

      // 三、视频和音频

      // 四、Canvas绘图

      // 五、SVG绘图

      // 六、拖拉API

      // 七、WebWorker

      // 八、WebStorage

      // 九、WebSocket

      // 十、地理定位

      // CSS3的新特性
      //       1）选择器
      // 2）阴影
      // 3）形状转换（2D <-> 3D）
      // 4）变形
      // 5）动画（过渡动画、帧动画）
      // 6）边框
      // 7）多重背景
      // 8）反射
      // 9）文字
      // 10）颜色函数（rgba/hsl/hsla）
      // 11）滤镜（filter）
      // 12）弹性布局
      // 13）多列布局
      // 14）栅格布局
      // 15）盒模型
      // 16）Web字体
      // 17）媒体查询

      // es6的新特性
      // 1.let const
      // 2.模块字符串
      // 3.解构
      // 4.函数的参数默认值
      // 5.箭头函数
      // 6.class类
      // 7.导入导出
      // 8.promise

      // undefined和null有什么区别;
      //       第一：null是JavaScript的关键字，而undefined是JavaScript的一个全局变量，也就是挂载在window对象上的一个变量，并不是关键字。

      // 第二：在使用typeof运算符进行检测时，Undefined类型的值会返回undefined.而Null类型的值返回为object
      // 第三：在需要进行字符串类型的转换时，null会转换成字符串null,而undefined会转换字符串undefined.
      // 第四：在进行数值类型的转换时，undefined会转换为NaN,无法参与计算，而null会转换为0,可以参与计算。
    </script>
  </body>
</html>
